from audio_pkg.models.configdata import VoiceParamConfig
import argparse
import os
import re
class ArgumentsValidator:
    def _validate_range(self, value, min_val, max_val):
        """验证数值范围"""
        try:
            ivalue = int(value)
            if not min_val <= ivalue <= max_val:
                raise argparse.ArgumentTypeError(
                    f"值必须在 {min_val}-{max_val} 之间（当前值：{value}）"
                )
            return ivalue
        except ValueError:
            raise argparse.ArgumentTypeError(f"无效的整数值：{value}")
        
    def _handle_text_input(self, value):
        """处理 -t 参数的输入，支持文本或文件路径"""
        if os.path.isfile(value):  # 如果是文件路径
            with open(value, 'r', encoding='utf-8') as file:
                return file.read().strip()  # 读取文件内容并返回
        return value  # 否则验证并返回文本
    
    def parse_task_ids(self,value: str) -> tuple:
        """
        解析逗号或空格分隔的任务ID字符串，返回元组
        任务ID可以包含字母和数字。
        示例输入: "123,abc" 或 "123 abc" 或 "123, abc"
        """
        # 使用正则表达式分割逗号或空格
        task_ids = re.split(r'[,\s]+', value)
        # 过滤空字符串并去除两端空白
        task_ids = [tid.strip() for tid in task_ids if tid.strip()]
        # 验证任务ID格式（允许字母和数字）
        for tid in task_ids:
            if not re.match(r'^[a-zA-Z0-9]+$', tid):
                raise argparse.ArgumentTypeError(f"无效的任务ID: {tid}")
        return tuple(task_ids)


class MyArgument:
    def __init__(self, par_config:VoiceParamConfig,Validator: ArgumentsValidator):
        self.par_config = par_config
        self.parser = argparse.ArgumentParser(
            description="文本转语音命令行工具",
            formatter_class=argparse.ArgumentDefaultsHelpFormatter
        )
    
        self.validator = Validator
        self._init_arguments()

    def _init_arguments(self):
        # 创建子命令解析器
        subparsers = self.parser.add_subparsers(dest="command", help="可用命令", required=True)

        # --------------------------
        # 命令1: create - 创建任务
        # --------------------------
        create_parser = subparsers.add_parser("create", help="创建语音合成任务")

        # 必选参数
        create_parser.add_argument(
            "-t", "--text",
            type=self.validator._handle_text_input,
            help="请输入要转成语音的文本",
            required=True
        )

        # 可选参数：语速、音量、音调（范围 0-15）
        range_params = {
            "type": lambda x: self.validator._validate_range(
                x,
                self.par_config.SPEED_VOLUME_PITCH_RANGE[0],
                self.par_config.SPEED_VOLUME_PITCH_RANGE[1]
            )
        }
        create_parser.add_argument(
            "-s", "--speed",
            **range_params,
            default=self.par_config.DEFAULT_SPEED,
            help="语音速度，取值范围0-15，默认:{}".format(self.par_config.DEFAULT_SPEED)
        )
        create_parser.add_argument(
            "-v", "--volume",
            **range_params,
            default=self.par_config.DEFAULT_VOLUME,
            help="音量调节，取值范围0-15，默认:{}".format(self.par_config.DEFAULT_VOLUME)
        )
        create_parser.add_argument(
            "-p", "--pitch",
            **range_params,
            default=self.par_config.DEFAULT_PITCH,
            help="音调调节，取值范围0-15，默认:{}".format(self.par_config.DEFAULT_PITCH)
        )

        # 其他参数
        create_parser.add_argument(
            "-c", "--chcr",
            type=int,
            choices=self.par_config.CHOICES_VOICE,
            default=self.par_config.DEFAULT_VOICE,
            help="语音选择，默认:{}".format(self.par_config.DEFAULT_VOICE)
        )
        create_parser.add_argument(
            "-f", "--format",
            type=str,
            choices=self.par_config.AUDIO_FORMAT,
            default=self.par_config.DEFAULT_AUDIO_FORMAT,
            help="音频格式：mp3-16k, mp3-48k, wav, pcm-8k, pcm-16k,默认格式:{}".format(self.par_config.DEFAULT_AUDIO_FORMAT)
        )
        create_parser.add_argument(
            "-e", "--enable_subtitle",
            type=int,
            choices = self.par_config.ENABLE_SUBTITLE_CHOICES,
            default = self.par_config.DEFAULT_ENABLE_SUBTITLE,
            help = '''
                是否开启字幕,取值范围0, 1, 2，
                默认为0。0表示不开启字幕，
                1表示开启句级别字幕，
                2表示开启词级别字幕
            '''
        )

        # --------------------------
        # 命令2: query - 查询任务
        # --------------------------
        query_parser = subparsers.add_parser("query", help="查询任务状态")
        query_parser.add_argument(
            "-i",
            "--task_id",
            type=self.validator.parse_task_ids,
            required=True,
            default=-1,
            help="要查询的任务ID"
        )

        # --------------------------
        # 命令3: 保存资源
        # --------------------------
        query_parser = subparsers.add_parser("save", help="下载并保存资源")
        query_parser.add_argument(
            "-i",
            "--task_id",
            type=self.validator.parse_task_ids,
            required=True,
            help="下载资源的任务ID"
        )
        # --------------------------
        # 命令4: auto - 自动创建+轮询查询
        # --------------------------
        auto_parser = subparsers.add_parser("auto", help="自动创建并轮询任务状态")

        # 复用 create 的参数组

        auto_parser.add_argument(
            "-i",
            "--task_id",
            default=None,
        )
        auto_parser.add_argument(
            "-t", "--text",
            type=self.validator._handle_text_input,
            help="请输入要转成语音的文本",
            required=True
        )
        auto_parser.add_argument(
            "-s", "--speed",
            **range_params,
            default=self.par_config.DEFAULT_SPEED,
            help="语音速度，取值范围0-15，默认:{}".format(self.par_config.DEFAULT_SPEED)
        )
        auto_parser.add_argument(
            "-v", "--volume",
            **range_params,
            default=self.par_config.DEFAULT_VOLUME,
            help="音量调节，取值范围0-15，默认:{}".format(self.par_config.DEFAULT_VOLUME)
        )
        auto_parser.add_argument(
            "-p", "--pitch",
            **range_params,
            default=self.par_config.DEFAULT_PITCH,
            help="音调调节，取值范围0-15，默认:{}".format(self.par_config.DEFAULT_PITCH)
        )
        auto_parser.add_argument(
            "-c", "--chcr",
            type=int,
            choices=self.par_config.CHOICES_VOICE,
            default=self.par_config.DEFAULT_VOICE,
            help="语音选择，默认:{}".format(self.par_config.DEFAULT_VOICE)
        )
        auto_parser.add_argument(
            "-f", "--format",
            type=str,
            choices=self.par_config.AUDIO_FORMAT,
            default=self.par_config.DEFAULT_AUDIO_FORMAT,
            help="音频格式：mp3-16k, mp3-48k, wav, pcm-8k, pcm-16k,默认格式:{}".format(self.par_config.DEFAULT_AUDIO_FORMAT)
        )
        auto_parser.add_argument(
            "-e", "--enable_subtitle",
            type=int,
            choices=self.par_config.ENABLE_SUBTITLE_CHOICES,
            default=self.par_config.DEFAULT_ENABLE_SUBTITLE,
            help='''
                是否开启字幕,取值范围0, 1, 2，
                默认为0。0表示不开启字幕，
                1表示开启句级别字幕，
                2表示开启词级别字幕
            '''
        )
        auto_parser.add_argument(
            "-T","--Times",
            type=int,
            default=self.par_config.DEFAULT_TIMES,
            help="轮询的次数，默认15次"
        )

        auto_parser.add_argument(
            "-d","--delay",
            type=int,
            default=self.par_config.DEFAULT_DELAY,
            help="轮询的时间间隔，默认4秒"
        )
    def parse_args(self):
        """解析并返回参数"""
        return self.parser.parse_args()

